from rest_framework.response import Response
from rest_framework.views import APIView
from django.http import HttpResponse

from libs.yuntongxun.sms import CCP
from verifications import contants
from verifications.serializers import RegisterSMSCodeSerializer

"""
需求：
    前端生成一个uuid，前端把生成的uuid给后端，后端接收，并且生成一个图片验证码
    
后端：
    一，大体的思路
    1.接受uuid
    2.生成一个图片验证码
    3.保存验证码内容
    4.把图片返回回去
    二，确定请求方式和路由
        GET  /verifications/imagecodes/(?P<image_code_id>.+)/
        POST
        PUT
        DELETE
    三.确定使用哪个视图
        APIView                       :DRF的基类
        GeneriAPIView                 :对列表视图和详情视图做了通用支持,一般和Mixin扩展使用
        ListAPIView,RetrieveAPIView   :连get方法都不用写,自动调用系统的mixin实现对数据的操作
"""

from libs.captcha.captcha import captcha
from django_redis import get_redis_connection


class RegisterImageCodeView(APIView):
    """
    生成验证码
    GET verifications/imagecodes/(?P<image_code_id>.+)/
    需要通过JS生成一个唯一码,以确保后台对图片进行校验
    """

    def get(self,request,image_code_id):
        """
        1.接受uuid
        2.生成一个图片验证码
        3.保存验证码内容
        4.把图片返回回去
        """
        # 生成一个图片验证码
        text,image = captcha.generate_captcha()
        # 保存验证码内容
        # 配置
        redis_conn = get_redis_connection('code')
        # 保存在redis里面
        redis_conn.setex('img_%s' % image_code_id, contants.IMAGECODEEXPIRE, text)
        print("验证码："+text)
        # 把图片返回回去
        return HttpResponse(image, content_type='image/jpeg')



"""
需求：
    当用户输入手机号，验证码之后，需要让前端将 手机号，图片验证码内容以及UUID传递给后端
    
后端：
    一，大体步骤：
    1.接受数据
    2.校验数据
        验证手机号
        验证图片验证码是否与redis的一致
    3.生成一个短信验证码
    4.云通讯发送
    5.保存短信验证码到redis中
    6.返回响应
    二，确定请求方式和路由
        GET  /verifications/smscodes/(?P<mobile>1[345789]\d{9})/?text=xxxx&image_code_id=xxxx
        POST
        PUT
        DELETE
    三.确定使用哪个视图
        APIView                       :DRF的基类
        GeneriAPIView                 :对列表视图和详情视图做了通用支持,一般和Mixin扩展使用
        ListAPIView,RetrieveAPIView   :连get方法都不用写,自动调用系统的mixin实现对数据的操作
"""
from rest_framework.generics import GenericAPIView


class RegisterSMSCodeView(APIView):

    def get(self,request,mobile):
        query_params = request.query_params
        serializer = RegisterSMSCodeSerializer(data=query_params)
        serializer.is_valid(raise_exception=True)
        # 生成一个短信验证码
        from random import randint
        sms_code = '%06d' % randint(0, 999999)
        # 发送短信省略
        # CCP().send_template_sms(mobile,[sms_code,5],1)
        from celery_tasks.sms.tasks import send_sms_code
        # delay 的参数 同 send_sms_code的参数
        send_sms_code.delay(mobile,sms_code)
        print(sms_code)
        # 判断成功与否省略
        redis_conn = get_redis_connection('code')
        redis_conn.setex('sms_%s' % mobile, contants.SMSCODEEXPIRE, sms_code)
        return Response({'message':'ok'})
